<!DOCTYPE html>
<html lang="en-us">
  <head>

    <meta http-equiv="content-type" content="text/html; charset=utf-8">
    
<meta charset="UTF-8">
<title>Index Sorting | Elasticsearch Guide [7.7] | Elastic</title>
<link rel="home" href="index.html" title="Elasticsearch Guide [7.7]">
<link rel="up" href="index-modules.html" title="Index modules">
<link rel="prev" href="index-modules-history-retention.html" title="History retention">
<link rel="next" href="index-modules-index-sorting-conjunctions.html" title="Use index sorting to speed up conjunctions">
<meta name="DC.type" content="Learn/Docs/Elasticsearch/Reference/7.7">
<meta name="DC.subject" content="Elasticsearch">
<meta name="DC.identifier" content="7.7">
<meta name="robots" content="noindex,nofollow">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <script src="https://cdn.optimizely.com/js/18132920325.js"></script>
    <link rel="apple-touch-icon" sizes="57x57" href="/apple-icon-57x57.png">
    <link rel="apple-touch-icon" sizes="60x60" href="/apple-icon-60x60.png">
    <link rel="apple-touch-icon" sizes="72x72" href="/apple-icon-72x72.png">
    <link rel="apple-touch-icon" sizes="76x76" href="/apple-icon-76x76.png">
    <link rel="apple-touch-icon" sizes="114x114" href="/apple-icon-114x114.png">
    <link rel="apple-touch-icon" sizes="120x120" href="/apple-icon-120x120.png">
    <link rel="apple-touch-icon" sizes="144x144" href="/apple-icon-144x144.png">
    <link rel="apple-touch-icon" sizes="152x152" href="/apple-icon-152x152.png">
    <link rel="apple-touch-icon" sizes="180x180" href="/apple-icon-180x180.png">
    <link rel="icon" type="image/png" href="/favicon-32x32.png" sizes="32x32">
    <link rel="icon" type="image/png" href="/android-chrome-192x192.png" sizes="192x192">
    <link rel="icon" type="image/png" href="/favicon-96x96.png" sizes="96x96">
    <link rel="icon" type="image/png" href="/favicon-16x16.png" sizes="16x16">
    <link rel="manifest" href="/manifest.json">
    <meta name="apple-mobile-web-app-title" content="Elastic">
    <meta name="application-name" content="Elastic">
    <meta name="msapplication-TileColor" content="#ffffff">
    <meta name="msapplication-TileImage" content="/mstile-144x144.png">
    <meta name="theme-color" content="#ffffff">
    <meta name="naver-site-verification" content="936882c1853b701b3cef3721758d80535413dbfd">
    <meta name="yandex-verification" content="d8a47e95d0972434">
    <meta name="localized" content="true">
    <meta name="st:robots" content="follow,index">
    <meta property="og:image" content="https://www.elastic.co/static/images/elastic-logo-200.png">
    <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon">
    <link rel="icon" href="/favicon.ico" type="image/x-icon">
    <link rel="apple-touch-icon-precomposed" sizes="64x64" href="/favicon_64x64_16bit.png">
    <link rel="apple-touch-icon-precomposed" sizes="32x32" href="/favicon_32x32.png">
    <link rel="apple-touch-icon-precomposed" sizes="16x16" href="/favicon_16x16.png">
    <!-- Give IE8 a fighting chance -->
    <!--[if lt IE 9]>
    <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
    <link rel="stylesheet" type="text/css" href="/guide/static/styles.css">
  </head>

  <!--© 2015-2021 Elasticsearch B.V. Copying, publishing and/or distributing without written permission is strictly prohibited.-->

  <body>
    <!-- Google Tag Manager -->
    <script>dataLayer = [];</script><noscript><iframe src="//www.googletagmanager.com/ns.html?id=GTM-58RLH5" height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
    <script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start': new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0], j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src= '//www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f); })(window,document,'script','dataLayer','GTM-58RLH5');</script>
    <!-- End Google Tag Manager -->

    <!-- Global site tag (gtag.js) - Google Analytics -->
    <script async src="https://www.googletagmanager.com/gtag/js?id=UA-12395217-16"></script>
    <script>
      window.dataLayer = window.dataLayer || [];
      function gtag(){dataLayer.push(arguments);}
      gtag('js', new Date());
      gtag('config', 'UA-12395217-16');
    </script>

    <!--BEGIN QUALTRICS WEBSITE FEEDBACK SNIPPET-->
    <script type="text/javascript">
      (function(){var g=function(e,h,f,g){
      this.get=function(a){for(var a=a+"=",c=document.cookie.split(";"),b=0,e=c.length;b<e;b++){for(var d=c[b];" "==d.charAt(0);)d=d.substring(1,d.length);if(0==d.indexOf(a))return d.substring(a.length,d.length)}return null};
      this.set=function(a,c){var b="",b=new Date;b.setTime(b.getTime()+6048E5);b="; expires="+b.toGMTString();document.cookie=a+"="+c+b+"; path=/; "};
      this.check=function(){var a=this.get(f);if(a)a=a.split(":");else if(100!=e)"v"==h&&(e=Math.random()>=e/100?0:100),a=[h,e,0],this.set(f,a.join(":"));else return!0;var c=a[1];if(100==c)return!0;switch(a[0]){case "v":return!1;case "r":return c=a[2]%Math.floor(100/c),a[2]++,this.set(f,a.join(":")),!c}return!0};
      this.go=function(){if(this.check()){var a=document.createElement("script");a.type="text/javascript";a.src=g;document.body&&document.body.appendChild(a)}};
      this.start=function(){var a=this;window.addEventListener?window.addEventListener("load",function(){a.go()},!1):window.attachEvent&&window.attachEvent("onload",function(){a.go()})}};
      try{(new g(100,"r","QSI_S_ZN_emkP0oSe9Qrn7kF","https://znemkp0ose9qrn7kf-elastic.siteintercept.qualtrics.com/WRSiteInterceptEngine/?Q_ZID=ZN_emkP0oSe9Qrn7kF")).start()}catch(i){}})();
    </script><div id="ZN_emkP0oSe9Qrn7kF"><!--DO NOT REMOVE-CONTENTS PLACED HERE--></div>
    <!--END WEBSITE FEEDBACK SNIPPET-->

    <div id="elastic-nav" style="display:none;"></div>
    <script src="https://www.elastic.co/elastic-nav.js"></script>

    <!-- Subnav -->
    <div>
      <div>
        <div class="tertiary-nav d-none d-md-block">
          <div class="container">
            <div class="p-t-b-15 d-flex justify-content-between nav-container">
              <div class="breadcrum-wrapper"><span><a href="/guide/" style="font-size: 14px; font-weight: 600; color: #000;">Docs</a></span></div>
            </div>
          </div>
        </div>
      </div>
    </div>

    <div class="main-container">
      <section id="content">
        <div class="content-wrapper">

          <section id="guide" lang="en">
            <div class="container">
              <div class="row">
                <div class="col-xs-12 col-sm-8 col-md-8 guide-section">
                  <!-- start body -->
                  <div class="page_header">
<strong>IMPORTANT</strong>: No additional bug fixes or documentation updates
will be released for this version. For the latest information, see the
<a href="../current/index.html">current release documentation</a>.
</div>
<div id="content">
<div class="breadcrumbs">
<span class="breadcrumb-link"><a href="index.html">Elasticsearch Guide [7.7]</a></span>
»
<span class="breadcrumb-link"><a href="index-modules.html">Index modules</a></span>
»
<span class="breadcrumb-node">Index Sorting</span>
</div>
<div class="navheader">
<span class="prev">
<a href="index-modules-history-retention.html">« History retention</a>
</span>
<span class="next">
<a href="index-modules-index-sorting-conjunctions.html">Use index sorting to speed up conjunctions »</a>
</span>
</div>
<div class="chapter">
<div class="titlepage"><div><div>
<h2 class="title">
<a id="index-modules-index-sorting"></a>Index Sorting<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch/edit/7.7/docs/reference/index-modules/index-sorting.asciidoc">edit</a>
</h2>
</div></div></div>
<p>When creating a new index in Elasticsearch it is possible to configure how the Segments
inside each Shard will be sorted. By default Lucene does not apply any sort.
The <code class="literal">index.sort.*</code> settings define which fields should be used to sort the documents inside each Segment.</p>
<div class="warning admon">
<div class="icon"></div>
<div class="admon_content">
<p>nested fields are not compatible with index sorting because they rely on the assumption
that nested documents are stored in contiguous doc ids, which can be broken by index sorting.
An error will be thrown if index sorting is activated on an index that contains nested fields.</p>
</div>
</div>
<p>For instance the following example shows how to define a sort on a single field:</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">PUT twitter
{
    "settings" : {
        "index" : {
            "sort.field" : "date", <a id="CO422-1"></a><i class="conum" data-value="1"></i>
            "sort.order" : "desc" <a id="CO422-2"></a><i class="conum" data-value="2"></i>
        }
    },
    "mappings": {
        "properties": {
            "date": {
                "type": "date"
            }
        }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/1047.console"></div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO422-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p>This index is sorted by the <code class="literal">date</code> field</p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO422-2"><i class="conum" data-value="2"></i></a></p>
</td>
<td align="left" valign="top">
<p>…​ in descending order.</p>
</td>
</tr>
</table>
</div>
<p>It is also possible to sort the index by more than one field:</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">PUT twitter
{
    "settings" : {
        "index" : {
            "sort.field" : ["username", "date"], <a id="CO423-1"></a><i class="conum" data-value="1"></i>
            "sort.order" : ["asc", "desc"] <a id="CO423-2"></a><i class="conum" data-value="2"></i>
        }
    },
    "mappings": {
        "properties": {
            "username": {
                "type": "keyword",
                "doc_values": true
            },
            "date": {
                "type": "date"
            }
        }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/1048.console"></div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO423-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p>This index is sorted by <code class="literal">username</code> first then by <code class="literal">date</code></p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO423-2"><i class="conum" data-value="2"></i></a></p>
</td>
<td align="left" valign="top">
<p>…​ in ascending order for the <code class="literal">username</code> field and in descending order for the <code class="literal">date</code> field.</p>
</td>
</tr>
</table>
</div>
<p>Index sorting supports the following settings:</p>
<div class="variablelist">
<dl class="variablelist">
<dt>
<span class="term">
<code class="literal">index.sort.field</code>
</span>
</dt>
<dd>
The list of fields used to sort the index.
Only <code class="literal">boolean</code>, <code class="literal">numeric</code>, <code class="literal">date</code> and <code class="literal">keyword</code> fields with <code class="literal">doc_values</code> are allowed here.
</dd>
<dt>
<span class="term">
<code class="literal">index.sort.order</code>
</span>
</dt>
<dd>
<p>
The sort order to use for each field.
The order option can have the following values:
</p>
<div class="ulist itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
<code class="literal">asc</code>:  For ascending order
</li>
<li class="listitem">
<code class="literal">desc</code>: For descending order.
</li>
</ul>
</div>
</dd>
<dt>
<span class="term">
<code class="literal">index.sort.mode</code>
</span>
</dt>
<dd>
<p>
Elasticsearch supports sorting by multi-valued fields.
The mode option controls what value is picked to sort the document.
The mode option can have the following values:
</p>
<div class="ulist itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
<code class="literal">min</code>: 	Pick the lowest value.
</li>
<li class="listitem">
<code class="literal">max</code>: 	Pick the highest value.
</li>
</ul>
</div>
</dd>
<dt>
<span class="term">
<code class="literal">index.sort.missing</code>
</span>
</dt>
<dd>
<p>
The missing parameter specifies how docs which are missing the field should be treated.
 The missing value can have the following values:
</p>
<div class="ulist itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
<code class="literal">_last</code>: Documents without value for the field are sorted last.
</li>
<li class="listitem">
<code class="literal">_first</code>: Documents without value for the field are sorted first.
</li>
</ul>
</div>
</dd>
</dl>
</div>
<div class="warning admon">
<div class="icon"></div>
<div class="admon_content">
<p>Index sorting can be defined only once at index creation. It is not allowed to add or update
a sort on an existing index. Index sorting also has a cost in terms of indexing throughput since
documents must be sorted at flush and merge time. You should test the impact on your application
before activating this feature.</p>
</div>
</div>
<h3>
<a id="early-terminate"></a>Early termination of search request<a class="edit_me edit_me_private" rel="nofollow" title="Editing on GitHub is available to Elastic" href="https://github.com/elastic/elasticsearch/edit/7.7/docs/reference/index-modules/index-sorting.asciidoc">edit</a>
</h3>
<p>By default in Elasticsearch a search request must visit every document that match a query to
retrieve the top documents sorted by a specified sort.
Though when the index sort and the search sort are the same it is possible to limit
the number of documents that should be visited per segment to retrieve the N top ranked documents globally.
For example, let’s say we have an index that contains events sorted by a timestamp field:</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">PUT events
{
    "settings" : {
        "index" : {
            "sort.field" : "timestamp",
            "sort.order" : "desc" <a id="CO424-1"></a><i class="conum" data-value="1"></i>
        }
    },
    "mappings": {
        "properties": {
            "timestamp": {
                "type": "date"
            }
        }
    }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/1049.console"></div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO424-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p>This index is sorted by timestamp in descending order (most recent first)</p>
</td>
</tr>
</table>
</div>
<p>You can search for the last 10 events with:</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET /events/_search
{
    "size": 10,
    "sort": [
        { "timestamp": "desc" }
    ]
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/1050.console"></div>
<p>Elasticsearch will detect that the top docs of each segment are already sorted in the index
and will only compare the first N documents per segment.
The rest of the documents matching the query are collected to count the total number of results
and to build aggregations.</p>
<p>If you’re only looking for the last 10 events and have no interest in
the total number of documents that match the query you can set <code class="literal">track_total_hits</code>
to false:</p>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET /events/_search
{
    "size": 10,
    "sort": [ <a id="CO425-1"></a><i class="conum" data-value="1"></i>
        { "timestamp": "desc" }
    ],
    "track_total_hits": false
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/1051.console"></div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO425-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p>The index sort will be used to rank the top documents and each segment will early terminate the collection after the first 10 matches.</p>
</td>
</tr>
</table>
</div>
<p>This time, Elasticsearch will not try to count the number of documents and will be able to terminate the query
as soon as N documents have been collected per segment.</p>
<div class="pre_wrapper lang-console-result">
<pre class="programlisting prettyprint lang-console-result">{
  "_shards": ...
   "hits" : {  <a id="CO426-1"></a><i class="conum" data-value="1"></i>
      "max_score" : null,
      "hits" : []
  },
  "took": 20,
  "timed_out": false
}</pre>
</div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO426-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p>The total number of hits matching the query is unknown because of early termination.</p>
</td>
</tr>
</table>
</div>
<div class="note admon">
<div class="icon"></div>
<div class="admon_content">
<p>Aggregations will collect all documents that match the query regardless
of the value of <code class="literal">track_total_hits</code></p>
</div>
</div>

</div>
<div class="navfooter">
<span class="prev">
<a href="index-modules-history-retention.html">« History retention</a>
</span>
<span class="next">
<a href="index-modules-index-sorting-conjunctions.html">Use index sorting to speed up conjunctions »</a>
</span>
</div>
</div>

                  <!-- end body -->
                </div>
                <div class="col-xs-12 col-sm-4 col-md-4" id="right_col">
                  <div id="rtpcontainer" style="display: block;">
                    <div class="mktg-promo">
                      <h3>Most Popular</h3>
                      <ul class="icons">
                        <li class="icon-elasticsearch-white"><a href="https://www.elastic.co/webinars/getting-started-elasticsearch?baymax=default&amp;elektra=docs&amp;storm=top-video">Get Started with Elasticsearch: Video</a></li>
                        <li class="icon-kibana-white"><a href="https://www.elastic.co/webinars/getting-started-kibana?baymax=default&amp;elektra=docs&amp;storm=top-video">Intro to Kibana: Video</a></li>
                        <li class="icon-logstash-white"><a href="https://www.elastic.co/webinars/introduction-elk-stack?baymax=default&amp;elektra=docs&amp;storm=top-video">ELK for Logs &amp; Metrics: Video</a></li>
                      </ul>
                    </div>
                  </div>
                </div>
              </div>
            </div>
          </section>

        </div>


<div id="elastic-footer"></div>
<script src="https://www.elastic.co/elastic-footer.js"></script>
<!-- Footer Section end-->

      </section>
    </div>

<script src="/guide/static/jquery.js"></script>
<script type="text/javascript" src="/guide/static/docs.js"></script>
<script type="text/javascript">
  window.initial_state = {}</script>
  </body>
</html>
